package com.hzt.system.common.upload;

import com.github.tobato.fastdfs.domain.fdfs.StorePath;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.IOException;

/**
*
*
* @Author:hzt
* @Date:4:09 上午 2020/7/25
*/
@Component
@EnableConfigurationProperties(UploadProperties.class)  //引用UploadProperties
public class UploadService {
    private Log log= LogFactory.getLog(UploadService.class);

    @Autowired
    private FastFileStorageClient storageClient;

    @Autowired
    private UploadProperties prop;

    public String uploadImage(MultipartFile file){
        //1.校验文件类型
        String contentType = file.getContentType();
        if(!prop.getAllowTypes().contains(contentType)){
            throw new RuntimeException("文件类型不支持");
        }
        try {
            //2.校验文件内容
            BufferedImage image = ImageIO.read(file.getInputStream());
            if(image==null||image.getWidth()==0||image.getHeight()==0){
                throw new RuntimeException("上传的文件有问题");
            }
        } catch (IOException e) {
            log.error("校验文件内容失败....",e);
            throw new RuntimeException("校验文件内容失败"+e.getMessage());
        }

        //3上传到fastdfs
        try {
            //获取扩展名
            String extension = StringUtils.substringAfterLast(file.getOriginalFilename(), ".");
            //上传并获取上传路径
            StorePath storePath = storageClient.uploadFile(file.getInputStream(), file.getSize(), extension, null);
            //返回路径 此处要返回文件在服务器的相对路径，前面路径卸载前台共通调用
            return storePath.getFullPath();
        } catch (IOException e) {
            log.error("【文件上传】上传文件失败....",e);
            throw new RuntimeException("【文件上传】上传文件失败！"+e.getMessage());
        }

    }

}
